ã°ããŒãã«ãªèªè åãã«ãå ç¢ã§ã¹ã±ãŒã©ãã«ãã€ä¿å®æ§ã®é«ãã€ãã³ãé§ååã¢ãŒããã¯ãã£ïŒEDAïŒãæ§ç¯ããäžã§ã®åå®å šãªã¡ãã»ãŒãžãã¥ãŒã®éèŠãªåœ¹å²ãæ¢ããŸããããŸããŸãªEDAãã¿ãŒã³ãšãåå®å šæ§ãä¿¡é Œæ§ãã©ã®ããã«åäžãããããçè§£ããŸãã
åå®å šãªã¡ãã»ãŒãžãã¥ãŒïŒã¢ãã³ã€ãã³ãé§ååã¢ãŒããã¯ãã£ã®ç€
仿¥ã®æ¥éã«é²åããããžã¿ã«ç°å¢ã«ãããŠãã¬ãžãªãšã³ãã§ã¹ã±ãŒã©ãã«ãã€é©å¿æ§ã®é«ããœãããŠã§ã¢ã·ã¹ãã ãæ§ç¯ããããšã¯æéèŠèª²é¡ã§ããã€ãã³ãé§ååã¢ãŒããã¯ãã£ïŒEDAïŒã¯ããããã®ç®æšãéæããããã®äž»èŠãªãã©ãã€ã ãšããŠå°é ããã·ã¹ãã ãã€ãã³ãã«ãªã¢ã«ã¿ã€ã ã§åå¿ããããšãå¯èœã«ããŸããããããå ç¢ãªEDAã®äžæ žã«ã¯ãæ§ã ãªãµãŒãã¹éã®éåæéä¿¡ãä¿é²ããéèŠãªã³ã³ããŒãã³ãã§ããã¡ãã»ãŒãžãã¥ãŒããããŸããããããã·ã¹ãã ãè€éã«ãªãã«ã€ããŠã亀æãããã¡ãã»ãŒãžã®æŽåæ§ãšäºæž¬å¯èœæ§ã確ä¿ãããšããé倧ãªèª²é¡ãçããŸããããã§åå®å šãªã¡ãã»ãŒãžãã¥ãŒã掻èºãã忣ã·ã¹ãã ã«ãããä¿å®æ§ãä¿¡é Œæ§ãéçºè ã®çç£æ§ã«å¯Ÿããå ç¢ãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãåå®å šãªã¡ãã»ãŒãžãã¥ãŒã®äžçãšãã¢ãã³ã€ãã³ãé§ååã¢ãŒããã¯ãã£ã«ããããã®æ¥µããŠéèŠãªåœ¹å²ã«ã€ããŠæ·±ãæãäžããŠãããŸããEDAã®åºæ¬æŠå¿µãæ¢æ±ããæ§ã ãªã¢ãŒããã¯ãã£ãã¿ãŒã³ãæ€èšŒããåå®å šæ§ãã¡ãã»ãŒãžãã¥ãŒãåçŽãªããŒã¿äŒéè·¯ããä¿¡é Œã§ããéä¿¡ãã£ãã«ãžãšã©ã®ããã«å€é©ãããã匷調ããŸãã
ã€ãã³ãé§ååã¢ãŒããã¯ãã£ïŒEDAïŒã®çè§£
åå®å šæ§ã«ã€ããŠæ·±ãæãäžããåã«ãã€ãã³ãé§ååã¢ãŒããã¯ãã£ã®æ žãšãªãååãçè§£ããããšãäžå¯æ¬ ã§ããEDAã¯ãæ å ±ã®æµããã€ãã³ãã«ãã£ãŠé§åããããœãããŠã§ã¢èšèšãã¿ãŒã³ã§ããã€ãã³ããšã¯ãã·ã¹ãã å ã§çºçããéèŠãªåºæ¥äºãç¶æ ã®å€åã§ãããã·ã¹ãã ã®ä»ã®éšåãé¢å¿ãæã€å¯èœæ§ããããŸãããµãŒãã¹éã®çŽæ¥çã§åæçãªãªã¯ãšã¹ãã®ä»£ããã«ãEDAã¯ãããã¥ãŒãµãŒãã€ãã³ããçºè¡ããã³ã³ã·ã¥ãŒããŒããããã«åå¿ããããšã«äŸåããŸãããã®ãã«ãããªã³ã°ã«ã¯ããã€ãã®å©ç¹ããããŸãã
- ãã«ãããªã³ã°ïŒãµãŒãã¹ã¯äºãã®ååšãå®è£ ã®è©³çްãçŽæ¥ç¥ãå¿ èŠããããŸãããçç£ãŸãã¯æ¶è²»ããã€ãã³ããçè§£ããã ãã§ååã§ãã
- ã¹ã±ãŒã©ããªãã£ïŒåã ã®ãµãŒãã¹ã¯ãç¹å®ã®è² è·ã«åºã¥ããŠç¬ç«ããŠã¹ã±ãŒãªã³ã°ã§ããŸãã
- ã¬ãžãªãšã³ã¹ïŒãããµãŒãã¹ãäžæçã«å©çšã§ããªãå Žåã§ããä»ã®ãµãŒãã¹ã¯åŸã§ã€ãã³ããåŠçãããããªãã©ã€ãä»ããŠæäœãç¶ç¶ã§ããŸãã
- ãªã¢ã«ã¿ã€ã å¿çæ§ïŒã·ã¹ãã ã¯å€æŽã«å³åº§ã«åå¿ã§ããã©ã€ãããã·ã¥ããŒããäžæ£æ€åºãIoTããŒã¿åŠçãªã©ã®æ©èœãå¯èœã«ããŸãã
ã¡ãã»ãŒãžãã¥ãŒïŒã¡ãã»ãŒãžãããŒã«ãŒãŸãã¯ã¡ãã»ãŒãžæåããã«ãŠã§ã¢ãšãåŒã°ããïŒã¯ãEDAã®æ ¹å¹¹ããªããã®ã§ãããããã¯ä»²ä»åœ¹ãšããŠæ©èœããã¡ãã»ãŒãžãäžæçã«ä¿åããé¢å¿ã®ããã³ã³ã·ã¥ãŒããŒã«é ä¿¡ããŸããäžè¬çãªäŸãšããŠã¯ãApache KafkaãRabbitMQãAmazon SQSãGoogle Cloud Pub/Subãªã©ããããŸãã
課é¡ïŒã¡ãã»ãŒãžã¹ããŒããšããŒã¿æŽåæ§
忣ã·ã¹ãã ãç¹ã«EDAãæ¡çšããŠããã·ã¹ãã ã§ã¯ãè€æ°ã®ãµãŒãã¹ãã¡ãã»ãŒãžãçæããã³æ¶è²»ããŸãããããã®ã¡ãã»ãŒãžã¯ãã°ãã°ããžãã¹ã€ãã³ããç¶æ ã®å€åããŸãã¯ããŒã¿å€æã衚ããŸããã¡ãã»ãŒãžãã©ãŒãããã«å¯Ÿããæ§é åãããã¢ãããŒãããªããšãããã€ãã®åé¡ãçºçããå¯èœæ§ããããŸãã
- ã¹ããŒãã®é²åïŒã¢ããªã±ãŒã·ã§ã³ãé²åããã«ã€ããŠãã¡ãã»ãŒãžã®æ§é ïŒã¹ããŒãïŒã¯å¿ ç¶çã«å€åããŸããé©åã«ç®¡çãããªããšããããã¥ãŒãµãŒãã³ã³ã·ã¥ãŒããŒãçè§£ã§ããªãæ°ãã圢åŒã§ã¡ãã»ãŒãžãéä¿¡ãããããã®éãçºçãããããå¯èœæ§ããããŸããããã«ãããããŒã¿ç Žæãã¡ãã»ãŒãžã®æå€±ãã·ã¹ãã é害ã«ã€ãªããå¯èœæ§ããããŸãã
- ããŒã¿åãã¹ãããïŒãããã¥ãŒãµãŒããã£ãŒã«ãã«æŽæ°å€ãéä¿¡ããäžæ¹ã§ãã³ã³ã·ã¥ãŒããŒãæååãæåŸ ããããŸãã¯ãã®éãçºçããå¯èœæ§ããããŸãããããã®åŸ®åŠãªåãã¹ãããã¯ã忣ç°å¢ã§ã¯ãããã°ãå°é£ãªã©ã³ã¿ã€ã ãšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
- ææ§ããšèª€è§£ïŒæåŸ ãããããŒã¿åãšæ§é ãæç¢ºã«å®çŸ©ãããŠããªããšãéçºè ãã¡ãã»ãŒãžãã£ãŒã«ãã®æå³ã圢åŒã誀解ããã³ã³ã·ã¥ãŒããŒã®ããžãã¯ã誀ãå¯èœæ§ããããŸãã
- çµ±åã®èŠåŽïŒæ°ãããµãŒãã¹ãçµ±åããããæ¢åã®ãµãŒãã¹ãæŽæ°ãããããäœæ¥ã¯ãã¡ãã»ãŒãžåœ¢åŒãæåã§æ€èšŒããäºææ§ã®åé¡ãåŠçããéªšã®æããããã»ã¹ã«ãªããŸãã
ãããã®èª²é¡ã¯ãã¡ãã»ãŒãžäº€æã«ãããäžè²«æ§ãšäºæž¬å¯èœæ§ã匷å¶ããã¡ã«ããºã ã®å¿ èŠæ§ãæµ®ã圫ãã«ããŸãããããããã¡ãã»ãŒãžãã¥ãŒã«ãããåå®å šæ§ã®æ¬è³ªã§ãã
åå®å šãªã¡ãã»ãŒãžãã¥ãŒãšã¯ïŒ
EDAã®æèã«ãããåå®å šãªã¡ãã»ãŒãžãã¥ãŒãšã¯ãã¡ãã»ãŒãžã®æ§é ãšããŒã¿åãæ£åŒã«å®çŸ©ããã匷å¶ãããã·ã¹ãã ãæããŸããããã¯ããããã¥ãŒãµãŒãã¡ãã»ãŒãžãéä¿¡ããéã«ã¯ãäºåã«å®çŸ©ãããã¹ããŒãã«æºæ ããå¿ èŠããããã³ã³ã·ã¥ãŒããŒãã¡ãã»ãŒãžãåä¿¡ããéã«ã¯ãæåŸ ãããæ§é ãšåãæã€ããšãä¿èšŒãããããšãæå³ããŸããããã¯éåžžã以äžã®æ¹æ³ã§å®çŸãããŸãã
- ã¹ããŒãå®çŸ©ïŒãã£ãŒã«ãåãããŒã¿åïŒäŸïŒæååãæŽæ°ãããŒãªã¢ã³ãé åããªããžã§ã¯ãïŒãããã³å¶çŽïŒäŸïŒå¿ é ãã£ãŒã«ããããã©ã«ãå€ïŒãå«ããã¡ãã»ãŒãžã®æ§é ã®æ£åŒãªæ©æ¢°å¯èªãªå®çŸ©ã
- ã¹ããŒãã¬ãžã¹ããªïŒãããã®ã¹ããŒããä¿åã管çãæäŸããéäžãªããžããªããããã¥ãŒãµãŒã¯ã¹ããŒããç»é²ããã³ã³ã·ã¥ãŒããŒã¯äºææ§ã確ä¿ããããã«ããããååŸããŸãã
- ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³/ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ïŒå®çŸ©ãããã¹ããŒãã䜿çšããŠãããŒã¿ãéä¿¡çšã®ãã€ãã¹ããªãŒã ã«ã·ãªã¢ã©ã€ãºããåä¿¡æã«ãªããžã§ã¯ãã«ãã·ãªã¢ã©ã€ãºããã©ã€ãã©ãªãŸãã¯ããã«ãŠã§ã¢ããããã®ããã»ã¹ã¯ãã¹ããŒãã«å¯ŸããŠããŒã¿ãæ¬è³ªçã«æ€èšŒããŸãã
ç®æšã¯ãããŒã¿æ€èšŒã®è² æ ãã©ã³ã¿ã€ã ããã³ã³ãã€ã«æãŸãã¯éçºã®æ©ææ®µéã«ç§»è¡ããããšã©ãŒãçºèŠããããããæ¬çªç°å¢ã«å°éããã®ãé²ãããšã§ãã
åå®å šãªã¡ãã»ãŒãžãã¥ãŒã®äž»ãªã¡ãªãã
åå®å šãªã¡ãã»ãŒãžãã¥ãŒãæ¡çšããããšã¯ãã€ãã³ãé§ååã·ã¹ãã ã«å€ãã®ã¡ãªããããããããŸãã
- ä¿¡é Œæ§ã®åäžïŒããŒã¿å¥çŽã匷å¶ããããšã§ãåå®å šæ§ã¯ãäžæ£ãªåœ¢åŒãŸãã¯äºæããªãã¡ãã»ãŒãžãã€ããŒãã«ãã£ãŠåŒãèµ·ããããã©ã³ã¿ã€ã ãšã©ãŒã®å¯èœæ§ãå€§å¹ ã«äœæžããŸããã³ã³ã·ã¥ãŒããŒã¯åä¿¡ããããŒã¿ãä¿¡é Œã§ããŸãã
- ä¿å®æ§ã®åäžïŒã¹ããŒãã®é²åã¯ç®¡çãããããã»ã¹ã«ãªããŸããã¹ããŒãã倿Žããå¿ èŠãããå Žåã¯ãæç€ºçã«è¡ãããŸããã³ã³ã·ã¥ãŒããŒã¯ãå¿ èŠã«å¿ããŠåŸæ¹äºææ§ãŸãã¯åæ¹äºææ§ã確ä¿ããªãããæ°ããããŒãžã§ã³ã®ã¹ããŒããåŠçããããã«æŽæ°ã§ããŸãã
- éçºãµã€ã¯ã«ã®é«éåïŒéçºè ã¯ã¡ãã»ãŒãžæ§é ã®æç¢ºãªå®çŸ©ãæã€ããšãã§ããæšæž¬ãææ§ããæžãããŸããããŒã«ã¯ã¹ããŒãã«åºã¥ããŠã³ãŒãïŒäŸïŒããŒã¿ã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ïŒãçæã§ããããšãå€ããçµ±åãå éããå®åçãªã³ãŒããåæžããŸãã
- ãããã°ã®ç°¡çŽ åïŒåé¡ãçºçããå Žåãåå®å šæ§ã¯æ ¹æ¬åå ãããè¿ éã«ç¹å®ããã®ã«åœ¹ç«ã¡ãŸããäžäžèŽã¯ãéçºãŸãã¯ãã¹ããã§ãŒãºã®æ©ã段éã§æ€åºãããããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³/ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ããã»ã¹ã«ãã£ãŠæç¢ºã«ç€ºãããŸãã
- è€éãªEDAãã¿ãŒã³ã®ä¿é²ïŒã€ãã³ããœãŒã·ã³ã°ãCQRSïŒCommand Query Responsibility SegregationïŒã®ãããªãã¿ãŒã³ã¯ãã€ãã³ãã®ã·ãŒã±ã³ã¹ã確å®ã«ä¿åãåçãåŠçããèœåã«å€§ããäŸåããŠããŸããåå®å šæ§ã¯ããããã®ã€ãã³ãã¹ããªãŒã ã®æŽåæ§ã確ä¿ããããã«äžå¯æ¬ ã§ãã
äžè¬çãªã€ãã³ãé§ååã¢ãŒããã¯ãã£ãã¿ãŒã³ãšåå®å šæ§
åå®å šãªã¡ãã»ãŒãžãã¥ãŒã¯ãæ§ã ãªé«åºŠãªEDAãã¿ãŒã³ã广çã«å®è£ ããããã®åºç€ãšãªããŸããããã€ãèŠãŠãããŸãããã
1. ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ãïŒPub/SubïŒ
Pub/Subãã¿ãŒã³ã§ã¯ããããªãã·ã£ãŒã¯ãµãã¹ã¯ã©ã€ããŒã誰ã§ããããç¥ãããšãªãããããã¯ã«ã¡ãã»ãŒãžãéä¿¡ããŸãããµãã¹ã¯ã©ã€ããŒã¯ç¹å®ã®ãããã¯ã«é¢å¿ã瀺ãããããã®ãããã¯ã«çºè¡ãããã¡ãã»ãŒãžãåä¿¡ããŸããã¡ãã»ãŒãžãã¥ãŒã¯ãå€ãã®å Žåããããã¯ãŸãã¯ãšã¯ã¹ãã§ã³ãžãä»ããŠãããå®è£ ããŸãã
åå®å
šæ§ã®åœ±é¿ïŒãµãŒãã¹ãã€ãã³ãïŒäŸïŒOrderCreatedãUserLoggedInïŒããããã¯ã«çºè¡ããå Žåãåå®å
šæ§ã«ããããã®ãããã¯ããæ¶è²»ãããã¹ãŠã®ãµãã¹ã¯ã©ã€ããŒããããã®ã€ãã³ããäžè²«ããæ§é ã§æåŸ
ããããšãä¿èšŒãããŸããããšãã°ãOrderCreatedã€ãã³ãã¯åžžã«orderIdïŒæååïŒãcustomerIdïŒæååïŒãtimestampïŒlongïŒãããã³itemsïŒproductIdãšquantityãæã€ãªããžã§ã¯ãã®é
åïŒãå«ãå¯èœæ§ããããŸãããããªãã·ã£ãŒãåŸã§customerIdãæååããæŽæ°ã«å€æŽããå Žåãã¹ããŒãã¬ãžã¹ããªãšã·ãªã¢ã©ã€ãŒãŒã·ã§ã³/ãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ããã»ã¹ããã®éäºææ§ãæ€åºããäžæ£ãªããŒã¿ãäŒæããã®ãé²ããŸãã
ã°ããŒãã«ãªäŸïŒã°ããŒãã«ãªeã³ããŒã¹ãã©ãããã©ãŒã ã«ã¯ãProductPublishedã€ãã³ãããããããããŸãããç°ãªãå°åãµãŒãã¹ïŒäŸïŒãšãŒããããã¢ãžã¢ãåç±³åãïŒããã®ã€ãã³ãã賌èªããŸããåå®å
šæ§ã¯ãåå°åã®åŠçããžãã¯ãç°ãªã£ãŠããŠãããã¹ãŠã®å°åãproductIdãnameãdescriptionãpriceïŒå®çŸ©ãããé貚圢åŒãŸãã¯åå¥ã®é貚ãã£ãŒã«ããæã€ïŒãšãã£ãäžè²«ãããã£ãŒã«ããæã€ProductPublishedã€ãã³ããåä¿¡ããããšãä¿èšŒããŸãã
2. ã€ãã³ããœãŒã·ã³ã°
ã€ãã³ããœãŒã·ã³ã°ã¯ãã¢ããªã±ãŒã·ã§ã³ç¶æ ã®ãã¹ãŠã®å€æŽãäžå€ã®ã€ãã³ãã®ã·ãŒã±ã³ã¹ãšããŠä¿åãããã¢ãŒããã¯ãã£ãã¿ãŒã³ã§ããã¢ããªã±ãŒã·ã§ã³ã®çŸåšã®ç¶æ ã¯ããããã®ã€ãã³ããåçããããšã«ãã£ãŠå°ãåºãããŸããã¡ãã»ãŒãžãã¥ãŒã¯ãã€ãã³ãã¹ãã¢ãšããŠããŸãã¯ã€ãã³ãã¹ãã¢ãžã®å°ç®¡ãšããŠæ©èœã§ããŸãã
åå®å šæ§ã®åœ±é¿ïŒã·ã¹ãã å šäœã®ç¶æ ã®æŽåæ§ã¯ãã€ãã³ããã°ã®æ£ç¢ºæ§ãšäžè²«æ§ã«äŸåããŸããããã§åå®å šæ§ã¯è²ããŸãããã€ãã³ãã¹ããŒããé²åããå Žåãå±¥æŽããŒã¿ãåŠçããããã®æŠç¥ïŒäŸïŒã¹ããŒãããŒãžã§ãã³ã°ãã€ãã³ã倿ïŒãæŽåãããŠããå¿ èŠããããŸããåå®å šæ§ããªããã°ãã€ãã³ãã®åçã¯ç¶æ ã®ç Žæã«ã€ãªãããã·ã¹ãã ãä¿¡é Œã§ããªããã®ã«ããå¯èœæ§ããããŸãã
ã°ããŒãã«ãªäŸïŒéèæ©é¢ã¯ãååŒå±¥æŽã«ã€ãã³ããœãŒã·ã³ã°ã䜿çšãããããããŸãããåååŒïŒé éãåŒãåºããééïŒã¯ã€ãã³ãã§ããåå®å šæ§ã¯ãå±¥æŽååŒèšé²ãäžè²«ããŠæ§é åãããŠããããšãä¿èšŒããç°ãªãã°ããŒãã«æ¯åºãèŠå¶æ©é¢ã暪æããŠæ£ç¢ºãªç£æ»ãç §åãç¶æ ã®åæ§ç¯ãå¯èœã«ããŸãã
3. ã³ãã³ãã¯ãšãªè²¬ååé¢ïŒCQRSïŒ
CQRSã¯ãæ å ±ã®æŽæ°ã«äœ¿çšãããã¢ãã«ïŒã³ãã³ãïŒãšãæ å ±ã®èªã¿åãã«äœ¿çšãããã¢ãã«ïŒã¯ãšãªïŒãåé¢ããŸããå€ãã®å Žåãã³ãã³ãã¯ã€ãã³ããçºçããããã®ã€ãã³ããèªã¿åãã¢ãã«ã®æŽæ°ã«äœ¿çšãããŸããã¡ãã»ãŒãžãã¥ãŒã¯ããããã®ã¢ãã«éã§ã³ãã³ããšã€ãã³ããäŒæããããã«ãã䜿çšãããŸãã
åå®å šæ§ã®åœ±é¿ïŒã©ã€ããµã€ãã«éä¿¡ãããã³ãã³ãããã³ã©ã€ããµã€ãã«ãã£ãŠçºè¡ãããã€ãã³ãã¯ã峿 Œãªã¹ããŒãã«æºæ ããå¿ èŠããããŸããåæ§ã«ããªãŒãã¢ãã«ãæŽæ°ããããã«äœ¿çšãããã€ãã³ããäžè²«ãã圢åŒãå¿ èŠãšããŸããåå®å šæ§ã¯ãã³ãã³ããã³ãã©ãåä¿¡ã³ãã³ããæ£ããè§£éããçæãããã€ãã³ããä»ã®ãµãŒãã¹ãšãªãŒãã¢ãã«ãããžã§ã¯ã¿ãŒã®äž¡æ¹ã«ãã£ãŠç¢ºå®ã«åŠçãããããšãä¿èšŒããŸãã
ã°ããŒãã«ãªäŸïŒããç©æµäŒç€Ÿã¯ãåºè·ç®¡çã«CQRSã䜿çšãããããããŸãããCreateShipmentCommandãæžã蟌ã¿ãµã€ãã«éä¿¡ãããŸããäœæãæåãããšãShipmentCreatedEventãçºè¡ãããŸããèªã¿åãã¢ãã«ã®ã³ã³ã·ã¥ãŒããŒïŒäŸïŒè¿œè·¡ããã·ã¥ããŒããé
ééç¥çšïŒããã®ã€ãã³ããåŠçããŸããåå®å
šæ§ã¯ãShipmentCreatedEventãshipmentIdãoriginAddressãdestinationAddressãestimatedDeliveryDateãstatusã®ãããªå¿
èŠãªãã¹ãŠã®è©³çްããã³ãã³ãã®çºä¿¡å
ãèªã¿åãã¢ãã«ãµãŒãã¹ã®å Žæã«é¢ä¿ãªããäºæž¬å¯èœãªåœ¢åŒã§å«ãããšãä¿èšŒããŸãã
åå®å šæ§ã®å®è£ ïŒããŒã«ãšæè¡
ã¡ãã»ãŒãžãã¥ãŒã«ãããåå®å šæ§ã®å®çŸã«ã¯ãéåžžãã·ãªã¢ã©ã€ãŒãŒã·ã§ã³åœ¢åŒãã¹ããŒãå®çŸ©èšèªãããã³å°éçãªããŒã«ã®çµã¿åããã䌎ããŸãã
1. ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³åœ¢åŒ
ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³åœ¢åŒã®éžæã¯éèŠãªåœ¹å²ãæãããŸããã¹ããŒãåŒ·å¶æ©èœãåããäžè¬çãªãªãã·ã§ã³ã«ã¯ã以äžã®ãã®ããããŸãã
- Apache AvroïŒJSONã§èšè¿°ãããã¹ããŒãã䜿çšããããŒã¿ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã·ã¹ãã ã§ããã³ã³ãã¯ãã§é«éã§ãããã¹ããŒãã®é²åããµããŒãããŸãã
- Protocol Buffers (Protobuf)ïŒèšèªã«äŸåããããã©ãããã©ãŒã ã«äŸåããªããæ§é åããŒã¿ãã·ãªã¢ã©ã€ãºããããã®æ¡åŒµå¯èœãªã¡ã«ããºã ã§ããå¹ççã§åºãæ¡çšãããŠããŸãã
- JSON SchemaïŒJSONããã¥ã¡ã³ãã«æ³šéãä»ããæ€èšŒããããšãå¯èœã«ããããã£ãã©ãªã§ããJSONèªäœã¯ã¹ããŒãã¬ã¹ã§ãããJSON Schemaã¯JSONããŒã¿ã®ã¹ããŒããå®çŸ©ããæ¹æ³ãæäŸããŸãã
- ThriftïŒFacebookã«ãã£ãŠéçºãããThriftã¯ãããŒã¿åãšãµãŒãã¹ãå®çŸ©ããããã«äœ¿çšãããã€ã³ã¿ãŒãã§ãŒã¹å®çŸ©èšèªïŒIDLïŒã§ãã
ãããã®åœ¢åŒã¯ãé©åãªã©ã€ãã©ãªãšçµã¿åãããŠäœ¿çšãããšãå®çŸ©ãããã¹ããŒãã«åŸã£ãŠããŒã¿ãã·ãªã¢ã©ã€ãºããã³ãã·ãªã¢ã©ã€ãºãããããšãä¿èšŒããããã»ã¹äžã«åã®äžäžèŽãææããŸãã
2. ã¹ããŒãã¬ãžã¹ããª
ã¹ããŒãã¬ãžã¹ããªã¯ãã¡ãã»ãŒãžåã®ã¹ããŒããä¿åããã³ç®¡çããäžå¿çãªã³ã³ããŒãã³ãã§ããäžè¬çãªã¹ããŒãã¬ãžã¹ããªã«ã¯ã以äžã®ãã®ããããŸãã
- Confluent Schema RegistryïŒApache Kafkaã®ããã¡ã¯ãã¹ã¿ã³ããŒãã§ãããAvroãJSON SchemaãProtobufããµããŒãããŠããŸãã
- AWS Glue Schema RegistryïŒAvroãJSON SchemaãProtobufããµããŒãããå®å šãããŒãžãåã®ã¹ããŒãã¬ãžã¹ããªã§ãKinesisãMSKãªã©ã®AWSãµãŒãã¹ãšè¯å¥œã«çµ±åãããŸãã
- Google Cloud Schema RegistryïŒGoogle Cloudã®Pub/SubãµãŒãã¹ã®äžéšã§ãããPub/Subãããã¯ã®ã¹ããŒã管çãå¯èœã«ããŸãã
ã¹ããŒãã¬ãžã¹ããªã«ããã以äžã®ããšãå¯èœã«ãªããŸãã
- ã¹ããŒãããŒãžã§ãã³ã°ïŒã¹ããŒãã®ç°ãªãããŒãžã§ã³ã管çããããšãã¹ããŒãã®é²åãåæ»ã«åŠçããããã«äžå¯æ¬ ã§ãã
- äºææ§ãã§ãã¯ïŒäºææ§ã«ãŒã«ïŒäŸïŒåŸæ¹äºææ§ãåæ¹äºææ§ãå®å šäºææ§ïŒãå®çŸ©ããã¹ããŒãã®æŽæ°ãæ¢åã®ã³ã³ã·ã¥ãŒããŒããããã¥ãŒãµãŒãå£ããªãããã«ããŸãã
- ã¹ããŒãçºèŠïŒã³ã³ã·ã¥ãŒããŒã¯ç¹å®ã®ã¡ãã»ãŒãžã«é¢é£ä»ããããã¹ããŒããçºèŠã§ããŸãã
3. ã¡ãã»ãŒãžãããŒã«ãŒãšã®çµ±å
åå®å šæ§ã®æå¹æ§ã¯ãéžæããã¡ãã»ãŒãžãããŒã«ãŒãšã®çµ±å床åãã«äŸåããŸãã
- Apache KafkaïŒConfluent Schema RegistryãšäœµçšãããããšããããããŸããKafkaã®ã³ã³ã·ã¥ãŒããŒãšãããã¥ãŒãµãŒã¯ãã¬ãžã¹ããªã«ãã£ãŠç®¡çãããã¹ããŒããšãšãã«ãAvroãŸãã¯Protobufã®ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã䜿çšããããã«èšå®ã§ããŸãã
- RabbitMQïŒRabbitMQèªäœã¯æ±çšã¡ãã»ãŒãžãããŒã«ãŒã§ãããã¡ãã»ãŒãžãAvroãProtobufããŸãã¯JSON Schemaã«ã·ãªã¢ã©ã€ãºããã©ã€ãã©ãªããRabbitMQãã¥ãŒã«éä¿¡ããåã«äœ¿çšããããšã§ãåå®å šæ§ã匷å¶ã§ããŸããã³ã³ã·ã¥ãŒããŒã¯ããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã®ããã«åãã©ã€ãã©ãªãšã¹ããŒãå®çŸ©ã䜿çšããŸãã
- Amazon SQS/SNSïŒRabbitMQãšåæ§ã«ãSQS/SNSã¯ã«ã¹ã¿ã ã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ããžãã¯ã§äœ¿çšã§ããŸãããããŒãžããœãªã¥ãŒã·ã§ã³ã®å ŽåãAWS Glue Schema Registryã¯ãKinesisïŒSQSã«äŸçµŠå¯èœïŒãªã©ã®ãµãŒãã¹ããŸãã¯ã¹ããŒãæ€èšŒããµããŒããããµãŒãã¹ãšçŽæ¥çµ±åã§ããŸãã
- Google Cloud Pub/SubïŒPub/Subãããã¯ã®ã¹ããŒã管çããµããŒãããŠãããAvroãŸãã¯Protocol Buffersã䜿çšããŠã¹ããŒããå®çŸ©ããã³åŒ·å¶ã§ããŸãã
åå®å šãªã¡ãã»ãŒãžãã¥ãŒå®è£ ã®ããã®ãã¹ããã©ã¯ãã£ã¹
åå®å šãªã¡ãã»ãŒãžãã¥ãŒã®ã¡ãªãããæå€§éã«åŒãåºãããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ããã
- æç¢ºãªã¡ãã»ãŒãžå¥çŽã®å®çŸ©ïŒã¡ãã»ãŒãžã¹ããŒããå ¬éAPIãšããŠæ±ããŸãããããã培åºçã«ææžåãããã®å®çŸ©ã«ãã¹ãŠã®é¢é£ããŒã ãå·»ã蟌ã¿ãŸãã
- ã¹ããŒãã¬ãžã¹ããªã®äœ¿çšïŒã¹ããŒã管çãéäžåããŸããããã¯ãããŒãžã§ãã³ã°ãäºææ§ãã¬ããã³ã¹ã«ãšã£ãŠäžå¯æ¬ ã§ãã
- é©åãªã·ãªã¢ã©ã€ãŒãŒã·ã§ã³åœ¢åŒã®éžæïŒAvroãProtobufããŸãã¯ä»ã®åœ¢åŒãéžæããéã«ã¯ãããã©ãŒãã³ã¹ãã¹ããŒãé²åæ©èœããšã³ã·ã¹ãã ãµããŒããããŒã¿ãµã€ãºãªã©ã®èŠå ãèæ ®ããŸãã
- ã¹ããŒãããŒãžã§ãã³ã°ã®æŠç¥çå®è£ ïŒã¹ããŒãã®é²åã«é¢ããæç¢ºãªã«ãŒã«ãå®çŸ©ããŸããåŸæ¹äºææ§ãåæ¹äºææ§ãå®å šäºææ§ã®éããçè§£ããã·ã¹ãã ã®ããŒãºã«æé©ãªæŠç¥ãéžæããŸãã
- ã¹ããŒãæ€èšŒã®èªååïŒCI/CDãã€ãã©ã€ã³ã«ã¹ããŒãæ€èšŒãçµ±åããæ©æã«ãšã©ãŒãææããŸãã
- ã¹ããŒãããã®ã³ãŒãçæïŒããŒã«ã掻çšããŠãã¹ããŒãããããã°ã©ãã³ã°èšèªã®ããŒã¿ã¯ã©ã¹ãã€ã³ã¿ãŒãã§ãŒã¹ãèªåçæããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³ã³ãŒããåžžã«ã¡ãã»ãŒãžå¥çŽãšåæããŠããããšãä¿èšŒããŸãã
- ã¹ããŒãã®é²åãæ éã«åŠçããïŒã¹ããŒããé²åãããéã¯ãæ¢åã®ã³ã³ã·ã¥ãŒããŒãäžæãããªãããã«ãå¯èœã§ããã°åŸæ¹äºææ§ãåªå ããŸããåŸæ¹äºææ§ãäžå¯èœãªå Žåã¯ã段éçãªããŒã«ã¢ãŠããèšç»ãã倿Žã广çã«äŒéããŸãã
- ã¹ããŒã䜿çšç¶æ³ã®ç£èŠïŒã©ã®ã¹ããŒãã誰ã«ãã£ãŠäœ¿çšãããŠããããããã³ãã®äºææ§ã¹ããŒã¿ã¹ã远跡ããŸããããã«ãããæœåšçãªåé¡ãç¹å®ããç§»è¡ãèšç»ããã®ã«åœ¹ç«ã¡ãŸãã
- ããŒã ã®æè²ïŒã¡ãã»ãŒãžãã¥ãŒã䜿çšãããã¹ãŠã®éçºè ããåå®å šæ§ãã¹ããŒã管çãããã³éžæãããããŒã«ã®éèŠæ§ãçè§£ããŠããããšã確èªããŸãã
ã±ãŒã¹ã¹ã¿ãã£æç²ïŒã°ããŒãã«Eã³ããŒã¹ã®æ³šæåŠç
ã«ã¿ãã°ç®¡çãæ³šæåŠçãåšåº«ãåºè·ã®ããã®ãã€ã¯ããµãŒãã¹ããç°ãªã倧éžããŸããã§éçšããã°ããŒãã«eã³ããŒã¹äŒæ¥ãæ³åããŠã¿ãŠãã ããããããã®ãµãŒãã¹ã¯ãKafkaããŒã¹ã®ã¡ãã»ãŒãžãã¥ãŒãä»ããŠéä¿¡ããŸãã
åå®å
šæ§ããªãã·ããªãªïŒæ³šæåŠçãµãŒãã¹ã¯ãorder_idïŒæååïŒãcustomer_idïŒæååïŒãããã³itemsïŒproduct_idãšquantityãæã€ãªããžã§ã¯ãã®é
åïŒãå«ãOrderPlacedã€ãã³ããæåŸ
ããŠããŸããã«ã¿ãã°ãµãŒãã¹ããŒã ãæ¥ãã§order_idãæŽæ°ãšããŠéä¿¡ããããããªæŽæ°ããããã€ããå Žåãæ³šæåŠçãµãŒãã¹ã¯ã¯ã©ãã·ã¥ããããæ³šæã誀åŠçãã顧客ã®äžæºãåçã®æå€±ã«ã€ãªããå¯èœæ§ããããŸãã忣ãµãŒãã¹å
šäœã§ããããããã°ããã®ã¯æªå€¢ã«ãªãã§ãããã
åå®å šæ§ãããã·ããªãªïŒAvroãšConfluent Schema Registryã䜿çšïŒïŒ
- ã¹ããŒãå®çŸ©ïŒAvroã䜿çšããŠ
OrderPlacedã€ãã³ãã¹ããŒããå®çŸ©ãããorderIdã¯stringãcustomerIdã¯stringãitemsã¯productIdïŒstringïŒãšquantityïŒintïŒãæã€ã¬ã³ãŒãã®é åãšããŠæå®ãããŸãããã®ã¹ããŒãã¯Confluent Schema Registryã«ç»é²ãããŸãã - ãããã¥ãŒãµãŒïŒã«ã¿ãã°ãµãŒãã¹ïŒïŒã«ã¿ãã°ãµãŒãã¹ã¯ãã¹ããŒãã¬ãžã¹ããªãæãAvroã·ãªã¢ã©ã€ã¶ãŒã䜿çšããããã«æ§æãããŠããŸãã
orderIdãæŽæ°ãšããŠéä¿¡ããããšãããšãã·ãªã¢ã©ã€ã¶ãŒã¯ç»é²ãããã¹ããŒãã«æºæ ããªããããã¡ãã»ãŒãžãæåŠããŸãããã®ãšã©ãŒã¯éçºãŸãã¯ãã¹ãäžã«å³åº§ã«ææãããŸãã - ã³ã³ã·ã¥ãŒããŒïŒæ³šæåŠçãµãŒãã¹ïŒïŒæ³šæåŠçãµãŒãã¹ã¯ãã¹ããŒãã¬ãžã¹ããªã«ããªã³ã¯ãããAvroãã·ãªã¢ã©ã€ã¶ãŒã䜿çšããŸããå®çŸ©ãããæ§é ãšåãåžžã«ååšãã
OrderPlacedã€ãã³ããèªä¿¡ãæã£ãŠåŠçã§ããŸãã - ã¹ããŒãã®é²åïŒåŸæ¥ãäŒç€Ÿã¯
OrderPlacedã€ãã³ãã«ãªãã·ã§ã³ã®discountCodeïŒstringïŒã远å ããããšã決å®ããŸããã¬ãžã¹ããªã§ã¹ããŒããæŽæ°ããdiscountCodeãnullableãŸãã¯ãªãã·ã§ã³ãšããŠããŒã¯ããŸãããã®æŽæ°ãåŸæ¹äºææ§ãæã€ããšãä¿èšŒããŸãããŸãdiscountCodeãæåŸ ããŠããªãæ¢åã®ã³ã³ã·ã¥ãŒããŒã¯ãããåã«ç¡èŠããŸãããã«ã¿ãã°ãµãŒãã¹ã®æ°ããããŒãžã§ã³ã¯ãããéä¿¡ãå§ããããšãã§ããŸãã
ãã®äœç³»çãªã¢ãããŒãã¯ãããŒã¿æŽåæ§ã®åé¡ã鲿¢ããéçºãå éãããè€éãªã·ã¹ãã ã«åãçµãã°ããŒãã«ããŒã ã«ãšã£ãŠããã·ã¹ãã å šäœãã¯ããã«å ç¢ã§ç®¡çãããããã®ã«ããŸãã
çµè«
åå®å šãªã¡ãã»ãŒãžãã¥ãŒã¯ãçŸä»£çã§ã¬ãžãªãšã³ãããã€ã¹ã±ãŒã©ãã«ãªã€ãã³ãé§ååã¢ãŒããã¯ãã£ãæ§ç¯ããããã®åãªãèŽ æ²¢åã§ã¯ãªããå¿ èŠäžå¯æ¬ ãªèŠçŽ ã§ããã¡ãã»ãŒãžã¹ããŒããæ£åŒã«å®çŸ©ã匷å¶ããããšã§ã忣ã·ã¹ãã ãæ©ãŸãããšã©ãŒã®å€§éšåã軜æžããŸãããããã¯éçºè ã«ããŒã¿æŽåæ§ãžã®èªä¿¡ãäžããéçºãåçåããã€ãã³ããœãŒã·ã³ã°ãCQRSã®ãããªé«åºŠãªãã¿ãŒã³ã®åºç€ã圢æããŸãã
çµç¹ããã€ã¯ããµãŒãã¹ã忣ã·ã¹ãã ããŸããŸãæ¡çšããã«ã€ããŠãã¡ãã»ãŒãžãã¥ãŒã€ã³ã°ã€ã³ãã©ã¹ãã©ã¯ãã£ã«ãããåå®å šæ§ã®æ¡çšã¯æŠç¥çãªæè³ãšãªããŸããããã«ãããããäºæž¬å¯èœãªã·ã¹ãã ãããå°ãªãæ¬çªç°å¢ã§ã®ã€ã³ã·ãã³ãããããŠããçç£çãªéçºäœéšãããããããŸããã°ããŒãã«ãã©ãããã©ãŒã ãæ§ç¯ããŠããå Žåã§ããå°éã®ãã€ã¯ããµãŒãã¹ãæ§ç¯ããŠããå Žåã§ããã€ãã³ãé§ååéä¿¡ã«ãããåå®å šæ§ãåªå ããããšã¯ãä¿¡é Œæ§ãä¿å®æ§ãããã³é·æçãªæåã«ãããŠå€§ããªå©çãããããã§ãããã